/**
 * 处理嵌套数组的笛卡尔积
 * @param arr 嵌套数组
 * @returns 笛卡尔积数组
 */
export function flattenDeep(arr) {
  return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flattenDeep(val) : val), []);
}

/**
 * 处理嵌套数组的笛卡尔积
 * @param nestedSets 嵌套数组
 * @returns 笛卡尔积数组
 */
export function getCartesian(nestedSets) {
  const flatSets = nestedSets.map((set) => (Array.isArray(set[0]) ? flattenDeep(set) : set));
  return flatSets.reduce(
    (acc, currentSet) =>
      acc.flatMap((accItem) => currentSet.map((currentItem) => [...accItem, currentItem])),
    [[]],
  );
}
